﻿using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace DLC.Module.DataTable
{
    public interface IDataTableManager
    {
        /// <summary>
        /// 是否存在数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <returns>是否存在数据表。</returns>
        bool HasDataTable<T>() where T : IDataRow;
        /// <summary>
        /// 是否存在数据表。
        /// </summary>
        /// <param name="dataRowType">数据表行的类型。</param>
        /// <returns>是否存在数据表。</returns>
        bool HasDataTable(Type dataRowType);
        /// <summary>
        /// 是否存在数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <param name="name">数据表名称。</param>
        /// <returns>是否存在数据表。</returns>
        bool HasDataTable<T>(string name) where T : IDataRow;
        /// <summary>
        /// 是否存在数据表。
        /// </summary>
        /// <param name="dataRowType">数据表行的类型。</param>
        /// <param name="name">数据表名称。</param>
        /// <returns>是否存在数据表。</returns>
        bool HasDataTable(Type dataRowType, string name);
        /// <summary>
        /// 获取数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <returns>要获取的数据表。</returns>
        IDataTable<T> GetDataTable<T>() where T : IDataRow;
        /// <summary>
        /// 获取数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <returns>要获取的数据表。</returns>
        IDataTable<T>[] GetDataTables<T>() where T : IDataRow;
        /// <summary>
        /// 获取数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <param name="name">数据表名称。</param>
        /// <returns>要获取的数据表。</returns>
        IDataTable<T> GetDataTable<T>(string name) where T : IDataRow;
        /// <summary>
        /// 添加数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <returns>要创建的数据表。</returns>
        IDataTable<T> AddDataTable<T>(IDataTable<T> dataTable) where T : class, IDataRow;
        /// <summary>
        /// 添加数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <param name="name">数据表名称。</param>
        /// <returns>要创建的数据表。</returns>
        IDataTable<T> AddDataTable<T>(string name, IDataTable<T> dataTable) where T : class, IDataRow;
        /// <summary>
        /// 销毁数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <returns>是否销毁数据表成功。</returns>
        bool RemoveDataTable<T>() where T : IDataRow;
        /// <summary>
        /// 销毁数据表。
        /// </summary>
        /// <param name="dataRowType">数据表行的类型。</param>
        /// <returns>是否销毁数据表成功。</returns>
        bool RemoveDataTable(Type dataRowType);
        /// <summary>
        /// 销毁数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <param name="name">数据表名称。</param>
        /// <returns>是否销毁数据表成功。</returns>
        bool RemoveDataTable<T>(string name) where T : IDataRow;
        /// <summary>
        /// 销毁数据表。
        /// </summary>
        /// <param name="dataRowType">数据表行的类型。</param>
        /// <param name="name">数据表名称。</param>
        /// <returns>是否销毁数据表成功。</returns>
        bool RemoveDataTable(Type dataRowType, string name);
        /// <summary>
        /// 销毁数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <param name="dataTable">要销毁的数据表。</param>
        /// <returns>是否销毁数据表成功。</returns>
        bool RemoveDataTable<T>(IDataTable<T> dataTable) where T : IDataRow;
        /// <summary>
        /// 添加数据表
        /// </summary>
        /// <param name="dataTable">数据表</param>
        /// <returns></returns>
        IDataTableRowType AddDataTable(IDataTableRowType dataTable);
        /// <summary>
        /// 添加数据表
        /// </summary>
        /// <param name="name">数据表名称</param>
        /// <param name="dataTable">数据表</param>
        /// <returns></returns>
        IDataTableRowType AddDataTable(string name, IDataTableRowType dataTable);
        /// <summary>
        /// 获取数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <param name="name">数据表名称。</param>
        /// <returns>要获取的数据表。</returns>
        IDataTableRowType[] GetDataTables(string name);
        /// <summary>
        /// 获取数据表。
        /// </summary>
        /// <typeparam name="T">数据表行的类型。</typeparam>
        /// <param name="name">数据表名称。</param>
        /// <returns>要获取的数据表。</returns>
        IDataTableRowType[] GetDataTables(Type type);
    }
}